#pragma once
#include <GLES3/gl3.h>
#include <map>
#include <memory>

/**
TextureBuffer是底层openGL纹理缓冲对象.
它用于保存纹理数据.
*/
class TextureBuffer
{
public:
	/**
	构造函数
	@param uniform 片段着色器的纹理统一变量
	*/
	static TextureBuffer* create(GLint uniform);

	/**
	更新纹理数据
	@param buffer 纹理数据
	@param width 纹理宽度
	@param height 纹理高度
	@param format 纹理格式
	*/
	void updateTexture(void* buffer, int width, int height, int format = GL_RGB);

	/**
	激活
	@param location 纹理位置0~31
	*/
	void use(int location);

	TextureBuffer();
	~TextureBuffer();

protected:
	bool init(GLint uniform);

	int _width;
	int _height;
    int _format;

	GLint _uniform;
	mutable GLuint _texture;
};

/**
TextureData是底层openGL纹理缓冲对象集合.
它用于保存一组纹理数据.
*/
class TextureData
{
public:
    /**
    创建TextureData的实例
    */
    static TextureData* create();
    /**
    获取TextureData中流的数量
    */
    size_t getStreamCount() const;
    /**
    将一个纹理缓存对象写入VertexData
    它将添加一个纹理缓存，或者覆盖旧的纹理缓存。
    @param buffer 纹理缓存对象
    @param location 纹理位置0~31
    */
    bool setStream(std::shared_ptr<TextureBuffer>& buffer, int location);
    /**
    删除指定的流
    @param location 流的location
    */
    void removeStream(int location);
    /**
    获取流
    @param location 流的location
    */
    std::shared_ptr<TextureBuffer>& getStream(int location);
    /**
    渲染时调用，它将顶点数据的状态绑定到当前渲染管道。
    */
    void use();

    TextureData();
    virtual ~TextureData();

protected:
    /**
    数据流
    */
    std::map<int, std::shared_ptr<TextureBuffer>> _textureStreams;
};
